﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GmFamilyService.h"
#include "GccpConnectorEnums.h"
#include "NdbObjectSchematic.h"
#include "NdbDataSchema.h"
#include "ICurve2d.h"
#include "IParameterCustomData.h"
#include "UniIdentity.h"
#include "FamilyConnectorEnums.h"

#define GCCP_CONNECTOR_CUSTOM_DATA_ID   L"GccpConnectorCustomDataId"

namespace gfam
{
    /// \brief 连接件数据基类
    class GM_FAMILY_SERVICE_EXPORT IGccpConnectorData : public gcmp::NdbObjectSchematic
    {
        DEFINE_CAST_DERIVED(gfam::IGccpConnectorData, gcmp::NdbObjectSchematic);
    public:
        /// \brief 获取连接件类型
        /// \return MEPConnectorType 连接件类型
        virtual gfam::GccpConnectorType GetType() const = 0;
        
        /// \brief 获取名称
        /// \return std::wstring 名称
        virtual const std::wstring& GetName() const = 0;

        /// \brief 设置名称
        /// \param std::wstring 名称
        /// \return void
        virtual void SetName(const std::wstring& name) = 0;

        /// \brief 获取坐标系
        /// \return Coordinate3d 连接件的坐标系
        virtual const gcmp::Coordinate3d& GetCoordinate() const = 0;

        /// \brief 设置坐标系
        /// \param coord 坐标系
        /// \return void
        virtual void SetCoordinate(const gcmp::Coordinate3d& coord) = 0;

        /// \brief 获取连接件是否为Primary连接点
        /// \return bool 连接件是否为Primary连接点
        virtual bool GetIsPrimary() const = 0;

        /// \brief 设置连接件是否为Primary连接点
        /// \param bool 是否为Primary连接点
        /// \return void
        virtual void SetIsPrimary(bool isPrimary) = 0;

        /// \brief 获取连接件的系统类型
        /// \return gfam::ConnectorShapType 系统类型
        virtual GccpConnectorShapType GetShapeType() const = 0;

        /// \brief 设置连接件的系统类型
        /// \param gfam::ConnectorShapType 系统类型
        /// \return void
        virtual void SetShapeType(const GccpConnectorShapType& type) = 0;

        /// \brief 获取与之关联连接件数据在数据集中的索引
        /// \return int 关联的连接件数据在数据集中的索引
        virtual int GetLinkConnectorDataIndex() const = 0;

        /// \brief 设置与之关联连接件数据在数据集中的索引
        /// \param int 关联的连接件数据在数据集中的索引
        /// \return void
        virtual void SetLinkConnectorDataIndex(int index) = 0;

        /// \return OwnerPtr<IGccpConnectorData> 克隆的对象
        virtual gcmp::OwnerPtr<IGccpConnectorData> Clone() const = 0;

        /// \brief 比较两个连接件数据是否相等
        /// \param pOther 比较对象的指针
        /// \return bool 比较结果
        virtual bool HasSameValue(const IGccpConnectorData* pOther) const = 0;

        /// \brief 比较自身数据是否小于另一个数据对象
        /// \param pOther 比较对象的指针
        /// \return bool 比较结果
        virtual bool IsLessThan(const IGccpConnectorData* pOther) const = 0;

    };

    /// \brief 电气数据
    class GM_FAMILY_SERVICE_EXPORT IGccpElectricalConnectorData : public IGccpConnectorData
    {
        DEFINE_CAST_DERIVED(gfam::IGccpElectricalConnectorData, IGccpConnectorData);

    public:
        /// \brief 创建一个默认的电气数据对象
        /// \return OwnerPtr<IGccpElectricalConnectorData> 创建的对象
        static gcmp::OwnerPtr<IGccpElectricalConnectorData> Create();

        /// \brief 获取系统类型
        /// \return GccpConnectorSystemType 系统类型
        virtual GccpConnectorSystemType GetSystemType() const = 0;

        /// \brief 设置电气系统类型IGccpWaterPipeConnectorData
        /// \param systemType 电气系统类型
        /// \return void
        virtual void SetSystemType(const GccpConnectorSystemType& systemType) = 0;

        /// \brief 获取角度
        /// \return double 角度
        virtual double GetAngle() const = 0;

        /// \brief 设置角度
        /// \param angle 角度
        /// \return void 
        virtual void SetAngle(double angle) = 0;

        /// \brief 获取角度绑定参数的uid
        ///
        /// 如果未绑定参数，则返回一个无效的uid
        /// \return UniIdentity 参数的uid
        virtual const gcmp::UniIdentity& GetAngleBindingUid() const = 0;

        /// \brief 设置角度绑定参数的uid
        /// 
        /// 如果未绑定参数，可以设置一个无效的uid
        /// \param uid 参数的uid
        /// \return void 
        virtual void SetAngleBindingUid(const gcmp::UniIdentity& uid) = 0;
    };

    /// \brief 水管数据
    class GM_FAMILY_SERVICE_EXPORT IGccpWaterPipeConnectorData : public IGccpConnectorData
    {
        DEFINE_CAST_DERIVED(gfam::IGccpWaterPipeConnectorData, IGccpConnectorData);

    public:
        /// \brief 创建一个默认的水管数据对象
        /// \return OwnerPtr<IGccpWaterPipeConnectorData> 创建的对象
        static gcmp::OwnerPtr<IGccpWaterPipeConnectorData> Create();

        /// \brief 获取连接件的流向类型，
        /// \return gfam::FlowDirectionType 结果可能为：双向、进、出
        virtual GccpFlowDirectionType GetFlowDirection() const = 0;

        /// \brief 设置连接件的流向类型
        /// \param gfam::FlowDirectionType 传入的连接点流向类型值可能为：双向、进、出
        /// \return void
        virtual void SetFlowDirection(GccpFlowDirectionType flowDirection) = 0;

        /// \brief 获取连接件在属性面板上是显示半径还是显示直径属性
        /// \return bool 如果返回true，就显示半径，否则显示直径
        virtual bool IsShowRadius() const = 0;

        /// \brief 设置连接件在属性面板上是显示半径还是显示直径属性
        /// \param bool 如果传入参数值为true，就显示半径；如果传入参数值为false，就显示直径
        /// \return void
        virtual void SetShowRadius(bool isShowRadius) = 0;

        /// \brief 获取内圆直径
        /// \return double 内圆直径
        virtual double GetDiameter() const = 0;

        /// \brief 设置内圆直径
        /// \param diameter 直径
        /// \return void 
        virtual void SetDiameter(double diameter) = 0;

        /// \brief 获取内圆直径绑定参数的uid
        ///
        /// 如果未绑定参数，则返回一个无效的uid
        /// \return UniIdentity 参数的uid
        virtual const gcmp::UniIdentity& GetDiameterBindingUid() const = 0;

        /// \brief 设置内圆直径绑定参数的uid
        /// 
        /// 如果未绑定参数，可以设置一个无效的uid
        /// \param uid 参数的uid
        /// \return void 
        virtual void SetDiameterBindingUid(const gcmp::UniIdentity& uid) = 0;
       
        /// \brief 获取内圆半径
        /// \return double 内圆半径
        virtual double GetRadius() const = 0;

        /// \brief 设置内圆半径
        /// \param radius 半径
        /// \return void 
        virtual void SetRadius(double radius) = 0;

        /// \brief 获取内圆半径绑定参数的uid
        ///
        /// 如果未绑定参数，则返回一个无效的uid
        /// \return UniIdentity 参数的uid
        virtual const gcmp::UniIdentity& GetRadiusBindingUid() const = 0;

        /// \brief 设置内圆半径绑定参数的uid
        /// 
        /// 如果未绑定参数，可以设置一个无效的uid
        /// \param uid 参数的uid
        /// \return void 
        virtual void SetRadiusBindingUid(const gcmp::UniIdentity& uid) = 0;

        /// \brief 获取壁厚
        /// \return double 壁厚
        virtual double GetWallThickness() const = 0;

        /// \brief 设置壁厚
        /// \param wallThickness 壁厚
        /// \return void 
        virtual void SetWallThickness(double wallThickness) = 0;

        /// \brief 获取壁厚绑定参数的uid
        ///
        /// 如果未绑定参数，则返回一个无效的uid
        /// \return UniIdentity 参数的uid
        virtual const gcmp::UniIdentity& GetWallThicknessBindingUid() const = 0;

        /// \brief 设置壁厚绑定参数的uid
        /// 
        /// 如果未绑定参数，可以设置一个无效的uid
        /// \param uid 参数的uid
        /// \return void 
        virtual void SetWallThicknessBindingUid(const gcmp::UniIdentity& uid) = 0;

        /// \brief 获取角度
        /// \return double 角度
        virtual double GetAngle() const = 0;

        /// \brief 设置角度
        /// \param angle 角度
        /// \return void 
        virtual void SetAngle(double angle) = 0;

        /// \brief 获取角度绑定参数的uid
        ///
        /// 如果未绑定参数，则返回一个无效的uid
        /// \return UniIdentity 参数的uid
        virtual const gcmp::UniIdentity& GetAngleBindingUid() const = 0;

        /// \brief 设置角度绑定参数的uid
        /// 
        /// 如果未绑定参数，可以设置一个无效的uid
        /// \param uid 参数的uid
        /// \return void 
        virtual void SetAngleBindingUid(const gcmp::UniIdentity& uid) = 0;

        /// \brief 获取水管系统类型
        /// \return gfam::WaterSystemType 水管系统类型
        virtual GccpConnectorSystemType GetSystemType() const = 0;

        /// \brief 设置水管系统类型
        /// \param systemType 水管系统类型
        /// \return void
        virtual void SetSystemType(const GccpConnectorSystemType& systemType) = 0;

        /// \brief 获取连接方式
        /// \return GccpConnectionType 连接方式
        virtual GccpConnectionType GetConnectionType() const = 0;

        /// \brief 设置连接方式
        /// \param connectionType 水管连接方式
        /// \return void
        virtual void SetConnectionType(GccpConnectionType connectionType) = 0;
    };

    /// \brief 线管数据
    class GM_FAMILY_SERVICE_EXPORT IGccpWirePipeConnectorData : public IGccpConnectorData
    {
        DEFINE_CAST_DERIVED(gfam::IGccpWirePipeConnectorData, IGccpConnectorData);

    public:
        /// \brief 创建一个默认的线管数据对象
        /// \return OwnerPtr<IGccpWirePipeConnectorData> 创建的对象
        static gcmp::OwnerPtr<IGccpWirePipeConnectorData> Create();

        /// \brief 获取连接件在属性面板上是显示半径还是显示直径属性
        /// \return bool 如果返回true，就显示半径，否则显示直径
        virtual bool IsShowRadius() const = 0;

        /// \brief 设置连接件在属性面板上是显示半径还是显示直径属性
        /// \param bool 如果传入参数值为true，就显示半径；如果传入参数值为false，就显示直径
        /// \return void
        virtual void SetShowRadius(bool isShowRadius) = 0;

        /// \brief 获取直径
        /// \return double 直径
        virtual double GetDiameter() const = 0;

        /// \brief 设置直径
        /// \param diameter 直径
        /// \return void 
        virtual void SetDiameter(double diameter) = 0;

        /// \brief 获取直径绑定参数的uid
        ///
        /// 如果未绑定参数，则返回一个无效的uid
        /// \return UniIdentity 参数的uid
        virtual const gcmp::UniIdentity& GetDiameterBindingUid() const = 0;

        /// \brief 设置直径绑定参数的uid
        /// 
        /// 如果未绑定参数，可以设置一个无效的uid
        /// \param uid 参数的uid
        /// \return void 
        virtual void SetDiameterBindingUid(const gcmp::UniIdentity& uid) = 0;

        /// \brief 获取半径
        /// \return double 半径
        virtual double GetRadius() const = 0;

        /// \brief 设置半径
        /// \param radius 半径
        /// \return void 
        virtual void SetRadius(double radius) = 0;

        /// \brief 获取半径绑定参数的uid
        ///
        /// 如果未绑定参数，则返回一个无效的uid
        /// \return UniIdentity 参数的uid
        virtual const gcmp::UniIdentity& GetRadiusBindingUid() const = 0;

        /// \brief 设置半径绑定参数的uid
        /// 
        /// 如果未绑定参数，可以设置一个无效的uid
        /// \param uid 参数的uid
        /// \return void 
        virtual void SetRadiusBindingUid(const gcmp::UniIdentity& uid) = 0;

        /// \brief 获取壁厚
        /// \return double 壁厚
        virtual double GetWallThickness() const = 0;

        /// \brief 设置壁厚
        /// \param wallThickness 壁厚
        /// \return void 
        virtual void SetWallThickness(double wallThickness) = 0;

        /// \brief 获取壁厚绑定参数的uid
        ///
        /// 如果未绑定参数，则返回一个无效的uid
        /// \return UniIdentity 参数的uid
        virtual const gcmp::UniIdentity& GetWallThicknessBindingUid() const = 0;

        /// \brief 设置壁厚绑定参数的uid
        /// 
        /// 如果未绑定参数，可以设置一个无效的uid
        /// \param uid 参数的uid
        /// \return void 
        virtual void SetWallThicknessBindingUid(const gcmp::UniIdentity& uid) = 0;

        /// \brief 获取角度
        /// \return double 角度
        virtual double GetAngle() const = 0;

        /// \brief 设置角度
        /// \param angle 角度
        /// \return void 
        virtual void SetAngle(double angle) = 0;

        /// \brief 获取角度绑定参数的uid
        ///
        /// 如果未绑定参数，则返回一个无效的uid
        /// \return UniIdentity 参数的uid
        virtual const gcmp::UniIdentity& GetAngleBindingUid() const = 0;

        /// \brief 设置角度绑定参数的uid
        /// 
        /// 如果未绑定参数，可以设置一个无效的uid
        /// \param uid 参数的uid
        /// \return void 
        virtual void SetAngleBindingUid(const gcmp::UniIdentity& uid) = 0;

        /// \brief 获取线管系统类型
        /// \return gfam::WireSystemType 线管系统类型
        virtual GccpConnectorSystemType GetSystemType() const = 0;

        /// \brief 设置线管系统类型
        /// \param systemType 线管系统类型
        /// \return void
        virtual void SetSystemType(const GccpConnectorSystemType& systemType) = 0;

        /// \brief 获取连接方式
        /// \return GccpConnectionType 连接方式
        virtual GccpConnectionType GetConnectionType() const = 0;

        /// \brief 设置连接方式
        /// \param connectionType 水管连接方式
        /// \return void
        virtual void SetConnectionType(GccpConnectionType connectionType) = 0;
    };

    /// \brief 桥梁湿接缝连接件数据
    class GM_FAMILY_SERVICE_EXPORT IBridgeWetJointConnectorData : public IGccpConnectorData
    {
        DEFINE_CAST_DERIVED(gfam::IBridgeWetJointConnectorData, IGccpConnectorData);

    public:
        /// \brief 创建一个默认的桥梁湿接缝连接件数据对象
        /// \return OwnerPtr<IBridgeWetJointConnectorData> 创建的对象
        static gcmp::OwnerPtr<IBridgeWetJointConnectorData> Create();

        /// \brief 获取桥梁湿接缝连接件类型
        /// \return BridgeWetJointType 桥梁湿接缝连接件类型
        virtual BridgeWetJointType GetBridgeWetJointType() const = 0;

        /// \brief 设置桥梁湿接缝连接件类型
        /// \param bridgeWetJointType 桥梁湿接缝连接件类型
        /// \return void
        virtual void SetBridgeWetJointType(BridgeWetJointType bridgeWetJointType) = 0;

        /// \brief 获取桥梁湿接缝连接件位置
        /// \return BridgeWetJointPosition 桥梁湿接缝连接件位置
        virtual BridgeWetJointPosition GetBridgeWetJointPosition() const = 0;

        /// \brief 设置桥梁湿接缝连接件位置
        /// \param bridgeWetJointType 桥梁湿接缝连接件位置
        /// \return void
        virtual void SetBridgeWetJointPosition(BridgeWetJointPosition bridgeWetJointPosition) = 0;

        /// \brief 设置桥梁湿接缝连接件id
        /// \param connectionId 桥梁湿接缝连接件id
        /// \return void
        virtual void SetConnectionId(Int32 connectionId) = 0;

        /// \brief 获取桥梁湿接缝连接件id
        /// \return 桥梁湿接缝连接件id
        virtual Int32 GetConnectionId() const = 0;
    };

    /// \brief 机电连接件自定义数据类，保存文档中连接点信息
    class GM_FAMILY_SERVICE_EXPORT IGccpConnectorCustomDatas : public gcmp::IParameterCustomData
    {
        DEFINE_CAST_DERIVED(gfam::IGccpConnectorCustomDatas, gcmp::IParameterCustomData);

    public:
        /// \brief 创建机电连接件自定义数据
        /// \param connectorDatas 各个机电连接件数据的集合
        /// \return 机电连接件自定义数据
        static gcmp::OwnerPtr<IGccpConnectorCustomDatas> Create(std::vector<gcmp::OwnerPtr<IGccpConnectorData>>&& connectorDatas);

        /// \brief 获取机电连接件数据的集合
        /// \return  机电连接件数据的集合
        virtual std::vector<gcmp::OwnerPtr<IGccpConnectorData>>& GetConnectorDatas() = 0;

        /// \brief 获取机电连接件数据的集合
        /// \return  机电连接件数据的集合
        virtual const std::vector<gcmp::OwnerPtr<IGccpConnectorData>>& GetConnectorDatas() const = 0;

        /// \brief 设置机电连接件数据的集合
        /// \param connectorDatas 机电连接件数据的集合
        /// \return bool 成功返回true，失败返回false
        virtual bool SetConnectorDatas(std::vector<gcmp::OwnerPtr<IGccpConnectorData>>&& connectorDatas) = 0;

        /// \brief 添加机电连接件数据
        /// \param connectorData 机电连接件数据
        /// \return bool 成功返回true，失败返回false
        virtual bool AddConnectorData(gcmp::OwnerPtr<IGccpConnectorData> connectorData) = 0;

    };

    class GM_FAMILY_SERVICE_EXPORT IGccpConnectorData2d : public IGccpConnectorData
    {
        DEFINE_CAST_DERIVED(gfam::IGccpConnectorData2d, gfam::IGccpConnectorData)

    public:
        /// \brief 创建一个默认的市政二维连接点数据对象
        /// \return 创建的市政二维连接点数据
        static gcmp::OwnerPtr<IGccpConnectorData2d> Create();

        /// \brief 获取二维连接点的方向
        /// \return 二维连接点的方向，单位矢量
        virtual gcmp::Vector3d GetDirection() const = 0;

        /// \brief 设置二维连接点的方向
        /// \param direction 二维连接点的方向
        virtual void SetDirection(const gcmp::Vector3d &direction) = 0;

        /// \brief 获取市政连接件的连接方式
        /// \return 连接方式
        virtual GccpConnectionType GetConnectionType() const = 0;

        /// \brief 设置市政连接件的连接方式
        /// \param connectionType 市政连接件的连接方式
        virtual void SetConnectionType(GccpConnectionType connectionType) = 0;

        /// \brief 获取目标连接件类型
        /// \return 目标连接件类型
        virtual ConnectorType GetTargetConnectorType() const = 0;

        /// \brief 设置目标连接件类型
        /// \param targetConnectorType 目标连接件类型
        virtual void SetTargetConnectorType(ConnectorType targetConnectorType) = 0;
    };
}
